<?php

class Vcode {
    private $width; //宽
    private $height; //高
    private $num; //数量
    private $code; //验证码
    private $img;

    function __construct($width, $height, $num) {
        $this -> width = $width;
        $this -> height = $height;
        $this -> num = $num;
        $this -> code = $this -> createcode();
    }
    // 获取字符的验证码，用于保存在服务器中
    function getcode(){
        return $this -> code;
    }
    // 输出图像
    function showImg() {
        // 创建背景
        $this -> createbg();
        // 画字（大小、字体颜色）
        $this -> drawstring();
        // 干扰元素（点、线条）
        $this -> setdisturb();
        // 输出图片
        $this -> outputimg();

    }
    //创建背景
    private function createbg () {
        //创建资源
        $this -> img = imagecreatetruecolor($this->width, $this->height);
        // 设置随机的背景颜色
        $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255));
        // 设置背景填充
        imagefill($this->img, 0, 0, $bgcolor);
        // 边框
        $bodercolor = imagecolorallocate($this->img, 0, 0, 0);
        imagerectangle($this->img, 0, 0, $this->width - 1, $this->height - 1, $bodercolor);
    }
    // 画字
    private function drawstring () {
        for($i=0;$i<$this->num;$i++) {
            $stringcolor = imagecolorallocate($this->img, rand(30, 125), rand(50, 125), rand(70, 125));
            $x = 15+(10*$i); //水平位置
            $y = rand(0, imagefontheight($fontsize)-5);
            $fontsize = rand(3, 5);
            imagestring($this->img, $fontsize, $x, $y, $this->code{$i}, $stringcolor);
        }
    }
    // 画干扰元素
    private function setdisturb () {
        // 加上点
        for($i=0; $i<100; $i++) {
            $color = imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255));
            imagesetpixel($this->img, rand(1, $this-> width -2), rand(1, $this-> height -2), $color);
        }
        // 加线条
        for($i=0; $i<10; $i++) {
            $color = imagecolorallocate($this->img, rand(200, 255), rand(200, 255), rand(200, 255));
            imagearc($this -> img, rand(1, $this->width-2), rand(1, $this->height-2), rand(20, 300), rand(20, 200), 55, 44, $color);
        }
    }
    private function outputimg () {
        // 在这里对图像进行一些操作
        $im = $this->img;
        // 处理输出
        if(function_exists('imagegif'))
        {
            // 针对 GIF
            header('Content-Type: image/gif');
            imagegif($im);
        }
        elseif(function_exists('imagejpeg'))
        {
            // 针对 JPEG
            header('Content-Type: image/jpeg');
            imagejpeg($im, NULL, 100);
        }
        elseif(function_exists('imagepng'))
        {
            // 针对 PNG
            header('Content-Type: image/png');
            imagepng($im);
        }
        elseif(function_exists('imagewbmp'))
        {
            // 针对 WBMP
            header('Content-Type: image/vnd.wap.wbmp');
            imagewbmp($im);
        }
        else
        {
            imagedestroy($im);
            die('No image support in this PHP server');
        }
        // 如果发现图像是以上的格式之一，就从内存中释放
        if($im)
        {
            imagedestroy($im);
        }
    }
    // 验证码字符生成
    private function createcode () {
        $my_code = "3456789abcdefghjkmnpqrstuvwxwABCDEFGHJKLNMPQRST";
        $code = "";
        for($i=0;$i<$this->num;$i++) {
            $code .= $my_code{rand(0, strlen($my_code)-1)};
        }
        return $code;

    }
    // 释放资源
    function __destruct() {
        imagedestroy($this -> img);
    }

}
